package com.jie.common.controller;

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.ICaptcha;
import com.jie.common.component.redis.CaptchaService;
import com.jie.common.domain.Captcha;
import com.jie.common.result.R;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Date;

/**
 * @description: 验证码前端控制器
 * @author: xiaojie
 * @since: 2024/12/12 0012
 */
@RestController
@RequestMapping("/captcha1")
public class CaptchaController {

    @Autowired
    private CaptchaService captchaService;

    @ApiOperation(value = "生成验证码拼图")
    @PostMapping("")
    public R getCaptcha(@RequestBody Captcha captcha) {
        return R.ok(captchaService.getCaptcha(captcha));
    }

    @ApiOperation(value = "生成验证码")
    //发送验证码图片给到浏览器
    @GetMapping("/get-captcha")//根据接口文档建立映射
    public void getCaptcha(HttpServletResponse response, //通过http响应把图片发送到浏览器
            HttpSession session) { //创建会话，确定单个用户

        //创建图形验证码，定义长和宽
        ICaptcha icaptcha = CaptchaUtil.createCircleCaptcha(90, 30);

        //定义键值对，Code代表正确的验证码
        session.setAttribute("Code", icaptcha.getCode());
        //设定创建时间 Date()是Java自带的工具类，可以获取创建该对象时的时间戳
        session.setAttribute("Time",new Date());

        //要加异常
        try {
            //规定数据类型
            response.setContentType("image/jpeg");
            //禁止缓存，防止无法向服务器读取图片
            response.setHeader("Pragma", "No-cache");
            //规定编码格式
            response.setCharacterEncoding("utf-8");

            //图片写入浏览器
            icaptcha.write(response.getOutputStream());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    //超时时间定义成两分钟
    public static Long OUT_TIME=2*60*1000L;

    @ApiOperation(value = "验证码校验")
    //校验用户输入的验证码是否正确
    @GetMapping("/check")
    public boolean check(String captcha, //根据接口文档定义，captcha是前端发送过来的用户输入的验证码
                         HttpSession session) {//session中存储此用户相关信息，比如验证码的创建时间，用于判断验证码是否过期

        //打印日志
        System.out.println("用户输入的验证码："+captcha);

        if(captcha == null || captcha == "") return false;//前端返回无效字符串直接返回假

        //校验时间是否过期
        Date before = (Date)session.getAttribute("Time");

        //超时返回假
        if(System.currentTimeMillis() - before.getTime() > OUT_TIME) return false;

        //获取正确的验证码
        String code = (String)session.getAttribute("Code");

        //比对验证码是否正确（不区分大小写）
        return captcha.equalsIgnoreCase(code);
    }


}
